import cv2
from keras.models import load_model
import numpy as np
import dlib

font = cv2.FONT_HERSHEY_COMPLEX_SMALL  # 设置字体
mod = load_model(r'C:\Users\s2096\PycharmProjects\pythonProject3\model3')  # 调用模块
camera = cv2.VideoCapture(0)  # 参数是0，表示打开笔记本的内置摄像头；参数是1，则打开外置摄像头；
# get_frontal_face_detector()函数，人脸检测画框，返回值是<class 'dlib.dlib.rectangle'>，就是一个矩形
detector = dlib.get_frontal_face_detector()


# 口罩识别函数
def mask(img):
    img1 = cv2.resize(img, dsize=(150, 150))
    img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)  # 颜色空间转换函数，第一个参数是需要转换的图片，第二个参数是转换成RGB
    img1 = np.array(img1) / 255.
    img_tensor = img1.reshape(-1, 150, 150, 3)  # 更改图像的维度
    pre = mod.predict(img_tensor)  # predict函数预测，0 是戴口罩，1是不戴口罩
    if pre[0][0] > 0.5:
        output = 'no-mask'
    else:
        output = 'have-mask'
    cv2.putText(img, output, (100, 200), font, 2, (0, 255, 0), 2, cv2.LINE_4)
    # 照片/结果/左上角坐标/字体/字体大小/颜色/字体粗细
    cv2.imshow('Camera', img)


# rec函数
def rec(img):
    # cv2.COLOR_BGR2GRAY意为图片的颜色从BGR(蓝绿红) 转换至GRAY(灰度)
    # 颜色空间转换函数，第一个参数是需要转换的图片，第二个参数是转换成灰度图
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    # dilb库人脸检测画框
    det = detector(gray, 1)
    if det is not None:
        for face in det:
            left = face.left()
            top = face.top()
            right = face.right()
            bottom = face.bottom()
            cv2.rectangle(img, (left, top), (right, bottom), (0, 255, 0), 2)
            # cv2.rectangle 这个函数的作用是在图像上绘制一个简单的矩形
            # 参数：图片，长方形框左上角坐标, 长方形框右下角坐标， 字体颜色，字体粗细


# 摄像头打开传入图像
while camera.isOpened():
    out, img_read = camera.read()
    # 按帧读取视频，ret,frame是获cap.read()方法的两个返回值。其中ret是布尔值，如果读取帧是正确的则返回True，
    # 如果文件读取到结尾，它的返回值就为False。frame就是每一帧的图像，是个三维矩阵
    if not out:
        break
    # 将视频每一帧传入两个函数，分别用于圈出人脸与判断是否带口罩

    rec(img_read)
    mask(img_read)
    # s 关闭窗口
    if cv2.waitKey(5) & 0xFF == ord('s'):
        break
# 释放摄像头
camera.release()
cv2.destroyAllWindows()
